import 'dart:math';
import '../models/mood_record.dart';
import '../models/mood_type.dart';
import 'mood_repository.dart';

/// 数据预生成服务
/// 用于在应用首次启动时生成示例数据
class DataSeeder {
  final MoodRepository _repository;
  final Random _random = Random();

  /// 构造函数
  DataSeeder(this._repository);

  /// 预定义的日记内容模板
  static const List<String> _diaryTemplates = [
    '今天心情不错，工作进展顺利，感觉很有成就感。',
    '有点累，但是完成了重要的任务，还是很满足的。',
    '和朋友聊天很开心，分享了很多有趣的事情。',
    '今天天气很好，出去散步感觉心情都变好了。',
    '工作压力有点大，需要好好调整一下状态。',
    '看了一部很棒的电影，被深深感动了。',
    '学习了新的技能，感觉自己在进步。',
    '和家人一起度过了温馨的时光。',
    '今天遇到了一些挫折，但我相信明天会更好。',
    '运动后感觉精神焕发，身心都很舒畅。',
    '读了一本好书，获得了很多启发。',
    '今天的阳光特别温暖，心情也跟着明朗起来。',
    '完成了一个小目标，给自己点个赞。',
    '和宠物玩耍的时光总是那么治愈。',
    '今天做了美味的料理，享受烹饪的过程。',
    '听音乐的时候感觉整个世界都安静了。',
    '今天有点想家，但也在努力适应新环境。',
    '工作中得到了同事的认可，很有动力。',
    '今天的夕阳特别美，拍了很多照片。',
    '和朋友一起吃饭聊天，感觉很放松。'
  ];

  /// 预定义的标签
  static const List<String> _tags = [
    '工作', '学习', '运动', '家庭', '朋友',
    '旅行', '美食', '音乐', '电影', '阅读',
    '宠物', '天气', '健康', '成长', '感恩',
    '挑战', '放松', '创作', '自然', '反思'
  ];

  /// 预定义的天气状况
  static const List<String> _weatherConditions = [
    '晴天', '多云', '阴天', '小雨', '大雨',
    '雪天', '雾天', '风大', '炎热', '凉爽'
  ];

  /// 预定义的位置
  static const List<String> _locations = [
    '家里', '办公室', '咖啡厅', '公园', '图书馆',
    '健身房', '商场', '餐厅', '学校', '地铁',
    '海边', '山上', '街道', '车里', '朋友家'
  ];

  /// 检查是否需要生成示例数据
  /// 返回true表示需要生成，false表示已有数据
  Future<bool> shouldSeedData() async {
    try {
      final totalRecords = await _repository.getTotalRecordsCount();
      return totalRecords == 0;
    } catch (e) {
      print('检查数据状态失败: $e');
      return false;
    }
  }

  /// 生成示例数据
  /// [daysBack] 生成多少天前的数据，默认30天
  /// [recordsPerDay] 每天生成的记录数量范围，默认0-3条
  Future<void> seedData({
    int daysBack = 30,
    int maxRecordsPerDay = 3,
  }) async {
    try {
      print('开始生成示例数据...');
      
      final now = DateTime.now();
      int totalGenerated = 0;
      
      // 为过去的每一天生成数据
      for (int i = 0; i < daysBack; i++) {
        final date = now.subtract(Duration(days: i));
        
        // 随机决定这一天生成多少条记录（0-maxRecordsPerDay）
        final recordsCount = _random.nextInt(maxRecordsPerDay + 1);
        
        for (int j = 0; j < recordsCount; j++) {
          final record = _generateRandomMoodRecord(date, j);
          await _repository.saveMoodRecord(record);
          totalGenerated++;
        }
      }
      
      print('示例数据生成完成，共生成 $totalGenerated 条记录');
    } catch (e) {
      print('生成示例数据失败: $e');
      throw Exception('生成示例数据失败: $e');
    }
  }

  /// 生成随机的情绪记录
  /// [baseDate] 基准日期
  /// [index] 当天的记录索引，用于生成不同的时间
  /// 返回生成的情绪记录
  MoodRecord _generateRandomMoodRecord(DateTime baseDate, int index) {
    // 随机选择情绪类型
    final moodType = _getRandomMoodType();
    
    // 生成随机时间（在指定日期的不同时段）
    final hour = _getRandomHourForIndex(index);
    final minute = _random.nextInt(60);
    final createdAt = DateTime(
      baseDate.year,
      baseDate.month,
      baseDate.day,
      hour,
      minute,
    );
    
    // 随机选择是否包含日记内容（70%概率）
    final hasDiary = _random.nextDouble() < 0.7;
    final diaryContent = hasDiary ? _getRandomDiaryContent() : null;
    
    // 随机生成情绪强度（1-10）
    final intensity = _random.nextInt(10) + 1;
    
    // 随机选择标签（0-3个）
    final tags = _getRandomTags();
    
    // 随机选择天气（50%概率）
    final hasWeather = _random.nextDouble() < 0.5;
    final weather = hasWeather ? _getRandomWeather() : null;
    
    // 随机选择位置（40%概率）
    final hasLocation = _random.nextDouble() < 0.4;
    final location = hasLocation ? _getRandomLocation() : null;
    
    return MoodRecord(
      moodType: moodType,
      diaryContent: diaryContent,
      createdAt: createdAt,
      updatedAt: createdAt,
      intensity: intensity,
      tags: tags,
      weather: weather,
      location: location,
      mediaAttachments: [], // 示例数据不包含媒体附件
    );
  }

  /// 随机选择情绪类型
  /// 使用加权随机，让积极情绪出现频率更高
  MoodType _getRandomMoodType() {
    final weights = {
      MoodType.happy: 25,
      MoodType.excited: 15,
      MoodType.calm: 20,
      MoodType.veryHappy: 15,
      MoodType.neutral: 15,
      MoodType.slightlySad: 10,
      MoodType.anxious: 8,
      MoodType.sad: 6,
      MoodType.angry: 5,
      MoodType.verySad: 3,
    };
    
    final totalWeight = weights.values.reduce((a, b) => a + b);
    final randomValue = _random.nextInt(totalWeight);
    
    int currentWeight = 0;
    for (final entry in weights.entries) {
      currentWeight += entry.value;
      if (randomValue < currentWeight) {
        return entry.key;
      }
    }
    
    return MoodType.neutral; // 默认返回中性情绪
  }

  /// 根据记录索引获取随机小时
  /// 确保同一天的多条记录在不同时段
  int _getRandomHourForIndex(int index) {
    switch (index) {
      case 0:
        return 8 + _random.nextInt(4); // 8-11点（上午）
      case 1:
        return 13 + _random.nextInt(4); // 13-16点（下午）
      case 2:
        return 19 + _random.nextInt(4); // 19-22点（晚上）
      default:
        return _random.nextInt(24); // 随机时间
    }
  }

  /// 随机选择日记内容
  String _getRandomDiaryContent() {
    final template = _diaryTemplates[_random.nextInt(_diaryTemplates.length)];
    
    // 有30%的概率添加额外的个人化内容
    if (_random.nextDouble() < 0.3) {
      final additionalContent = _getAdditionalContent();
      return '$template $additionalContent';
    }
    
    return template;
  }

  /// 获取额外的个人化内容
  String _getAdditionalContent() {
    final additionalContents = [
      '希望明天也能保持这样的状态。',
      '记录下这美好的一刻。',
      '感谢生活中的小确幸。',
      '每一天都是新的开始。',
      '要继续努力，相信自己。',
      '珍惜当下的每一个瞬间。',
      '生活总是充满惊喜。',
      '保持积极的心态很重要。',
    ];
    
    return additionalContents[_random.nextInt(additionalContents.length)];
  }

  /// 随机选择标签
  /// 返回0-3个随机标签的列表
  List<String> _getRandomTags() {
    final tagCount = _random.nextInt(4); // 0-3个标签
    if (tagCount == 0) return [];
    
    final selectedTags = <String>[];
    final availableTags = List<String>.from(_tags);
    
    for (int i = 0; i < tagCount && availableTags.isNotEmpty; i++) {
      final randomIndex = _random.nextInt(availableTags.length);
      selectedTags.add(availableTags.removeAt(randomIndex));
    }
    
    return selectedTags;
  }

  /// 随机选择天气
  String _getRandomWeather() {
    return _weatherConditions[_random.nextInt(_weatherConditions.length)];
  }

  /// 随机选择位置
  String _getRandomLocation() {
    return _locations[_random.nextInt(_locations.length)];
  }

  /// 生成特定情绪类型的示例记录
  /// [moodType] 指定的情绪类型
  /// [date] 记录日期
  /// 返回生成的情绪记录
  MoodRecord generateSpecificMoodRecord(MoodType moodType, DateTime date) {
    final diaryContent = _getDiaryContentForMood(moodType);
    final intensity = _getIntensityForMood(moodType);
    final tags = _getTagsForMood(moodType);
    
    return MoodRecord(
      moodType: moodType,
      diaryContent: diaryContent,
      createdAt: date,
      updatedAt: date,
      intensity: intensity,
      tags: tags,
      weather: _getRandomWeather(),
      location: _getRandomLocation(),
      mediaAttachments: [],
    );
  }

  /// 根据情绪类型获取相应的日记内容
  String _getDiaryContentForMood(MoodType moodType) {
    final moodSpecificContent = {
      MoodType.happy: ['今天心情特别好，一切都很顺利。', '感觉生活充满阳光，很开心。'],
      MoodType.excited: ['今天发生了很棒的事情，超级兴奋！', '期待已久的事情终于实现了。'],
      MoodType.calm: ['今天很平静，内心很安宁。', '享受这份宁静的时光。'],
      MoodType.sad: ['今天心情有些低落，需要时间调整。', '虽然难过，但相信会好起来的。'],
      MoodType.angry: ['今天遇到了让人生气的事情。', '需要冷静下来，理性处理问题。'],
      MoodType.anxious: ['今天有些焦虑，担心很多事情。', '试着放松心情，一步步来。'],
    };
    
    final contents = moodSpecificContent[moodType] ?? _diaryTemplates;
    return contents[_random.nextInt(contents.length)];
  }

  /// 根据情绪类型获取相应的强度
  int _getIntensityForMood(MoodType moodType) {
    final intensityRanges = {
      MoodType.happy: [7, 10],
      MoodType.excited: [8, 10],
      MoodType.calm: [6, 8],
      MoodType.sad: [2, 5],
      MoodType.angry: [3, 7],
      MoodType.anxious: [3, 6],
    };
    
    final range = intensityRanges[moodType] ?? [4, 7];
    return range[0] + _random.nextInt(range[1] - range[0] + 1);
  }

  /// 根据情绪类型获取相应的标签
  List<String> _getTagsForMood(MoodType moodType) {
    final moodSpecificTags = {
      MoodType.happy: ['开心', '积极', '满足'],
      MoodType.excited: ['兴奋', '期待', '激动'],
      MoodType.calm: ['平静', '放松', '安宁'],
      MoodType.sad: ['难过', '低落', '思考'],
      MoodType.angry: ['愤怒', '不满', '挫折'],
      MoodType.anxious: ['焦虑', '担心', '紧张'],
    };
    
    final specificTags = moodSpecificTags[moodType] ?? [];
    final generalTags = _getRandomTags();
    
    // 合并特定标签和随机标签
    final allTags = [...specificTags, ...generalTags];
    
    // 去重并限制数量
    final uniqueTags = allTags.toSet().toList();
    if (uniqueTags.length > 3) {
      uniqueTags.shuffle(_random);
      return uniqueTags.take(3).toList();
    }
    
    return uniqueTags;
  }
}